﻿#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
//#include <stdlib.h>
//int rand = 10;
//int main()
//{
//	// 编译报错：error C2365: “rand”: 重定义；以前的定义是“函数”
//	printf("%d\n", rand);
//	return 0;
//}

//第一个C++程序
//#include<iostream>
//using namespace std;
//
//int main()
//{
//	cout << "hello world\n" << endl;
//	return 0;
//}


//#include <stdio.h>
//#include <stdlib.h>
// 1. 正常的命名空间定义
// labi是命名空间的名字，一般开发中是用项目名字做命名空间名。
//namespace labi
//{
//	// 命名空间中可以定义变量/函数/类型
//	int rand = 10;
//
//	int Add(int left, int right)
//	{
//		return left + right;
//	}
//
//	struct Node
//	{
//		struct Node* next;
//		int val;
//	};
//}
//int main()
//{
//	// 这里默认是访问的是全局的rand函数指针
//	printf("%p\n", rand);
//
//	// 这里指定labi命名空间中的rand
//	printf("%d\n", labi::rand);//::是用来访问命名空间的
//
//	return 0;
//}

//#include <stdio.h>
//#include <stdlib.h>
//
//namespace labi
//{
//	//命名空间域
//	int a = 10;
//}
//
//int main()
//{
//	//局部域
//	int a = 1;
//	//默认会在局部域和全局域中找，不会找命名空间
//	printf("%d\n", a);
//
//	printf("%d\n", labi::a);
//}


// 命名空间可以嵌套
//namespace haha
//{
//	//蜡笔
//	namespace labi
//	{
//		int rand = 1;
//		int Add(int left, int right)
//		{
//			return left + right;
//		}
//	}
//	//小新
//	namespace xiaoxin
//	{
//		int rand = 2;
//		int Add(int left, int right)
//		{
//			return (left + right) * 10;
//		}
//	}
//}
//int main()
//{
//	printf("%d\n", haha::labi::rand);
//	printf("%d\n", haha::xiaoxin::rand);
//	printf("%d\n", haha::labi::Add(1, 2));
//	printf("%d\n", haha::xiaoxin::Add(1, 2));
//	return 0;
//}


//#include<stdio.h>
//namespace labi
//{
//	int a = 0;
//	int b = 1;
//}
//int main()
//{
//	// 编译报错：error C2065: “a”: 未声明的标识符
//	//printf("%d\n", a);
//
//	printf("%d\n", labi::a);
//	return 0;
//}

//#include<stdio.h>
//namespace labi
//{
//	int a = 0;
//	int b = 1;
//}
//
//
//// using将命名空间中某个成员展开
//using labi::b;
//int main()
//{
//	printf("%d\n", labi::a);
//	printf("%d\n", b);
//	return 0;
//}


//#include<stdio.h>
//namespace labi
//{
//	int a = 0;
//	int b = 1;
//}
//
//
//// 展开命名空间中全部成员
//using namespace labi;
//
//int main()
//{
//	printf("%d\n", a);
//	printf("%d\n", b);
//	return 0;
//}


//#include<iostream>
//using namespace std;
//
//int main()
//{
//	/*int i = 1234;
//	int j = -1234;
//	
//	cout << i << endl;
//	cout << j << endl;*/
//	/*int a = 0;
//	double b = 0.1;
//	char c = 'x';
//
//	cout << a << "             " << b << " " << c << "\n" << '\n' << endl;
//	std::cout << a << " " << b << " " << c << std::endl;*/
//	int a = 0;
//	double b = 0;
//	char c = 0;
//	scanf("%d%lf", &a, &b);
//	printf("%d %lf\n", a, b);
//
//	// 可以自动识别变量的类型
//	//cin >> a;
//	//cin >> b >> c;
//	cin >>a>> b >> c;
//	cout << a << endl;
//	cout << b << " " << c << endl;
//
//	return 0;
//}


//#include <iostream>
//#include <assert.h>
//
//using namespace std;
//void Func(int a = 0)
//{
//    cout << a << endl;
//}
//int main()
//{
//    Func(); // 没有传参时，使?参数的默认值
//    Func(10); // 传参时，使?指定的实参
//    return 0;
//}


//#include <iostream>
//
//using namespace std;
//
//// 全缺省
//void Func1(int a = 10, int b = 20, int c = 30)
//{
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//	cout << "c = " << c << endl << endl;
//}
//
//// 半缺省
////从右往左依次缼省，不得跳跃
//void Func2(int a, int b = 10, int c = 20)
//{
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//	cout << "c = " << c << endl << endl;
//}
//
//int main()
//{
//	Func1();
//	Func1(1);
//	Func1(1, 2);
//	//从左往右依次给参数，不得跳跃
//	//Func1(1, ,3)这种写法错误
//	Func1(1, 2, 3);
//	Func2(100);
//	Func2(100, 200);
//	Func2(100, 200, 300);
//	return 0;
//}

//#include<iostream>
//using namespace std;

// Stack.h
//#include <iostream>
//#include <assert.h>
//
//using namespace std;
//
//typedef int STDataType;
//
//typedef struct Stack
//{
//	STDataType* a;
//	int top;
//	int capacity;
//}ST;
//
//void STInit(ST* ps, int n = 4);
//
//// Stack.cpp
//#include"Stack.h"
//// 缺省参数不能声明和定义同时给
//void STInit(ST* ps, int n)
//{
//	assert(ps && n > 0);
//	ps->a = (STDataType*)malloc(n * sizeof(STDataType));
//	ps->top = 0;
//	ps->capacity = n;
//}
//
//#include"Stack.h"
//
//int main()
//{
//	ST s1;
//	STInit(&s1);
//	// 确定知道要插?1000个数据，初始化时?把开好，避免扩容
//	ST s2;
//	STInit(&s2, 1000);
//	return 0;
//}

#include<iostream>
using namespace std;
// 1、参数类型不同
int Add(int left, int right)
{
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}
double Add(double left, double right)
{
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}

// 2、参数个数不同
void f()
{
	cout << "f()" << endl;
}
void f(int a)
{
	cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{
	cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
	cout << "f(char b, int a)" << endl;
}


// 返回值不同不能作为重载条件，因为调用时也无法区分
//void fxx()
//{}
//
//int fxx()
//{
// return 0;
//}
// 下面两个函数构成重载
// f()但是调用时，会报错，存在歧义，编译器不知道调用谁

void f1()
{
	cout << "f()" << endl;
}

void f1(int a = 10)
{
	cout << "f(int a)" << endl;
}

int main()
{
	Add(10, 20);
	Add(10.1, 20.2);
	f();
	f(10);
	f(10, 'a');
	f('a', 10);
	return 0;
}

